
import React from 'react'



let allModule: IModule[] = [];
let allRoutes: IRoute[] = [];
let allMenu: IMenu[] = [];

export function install(modules: IModule[]): IModule[] {
	allModule = modules;
	for (let module of allModule) {
		let { routes, menu } = module;

		if (routes) {
			allRoutes = allRoutes.concat(routes);
		}

		menu && allMenu.push(menu);
	}

	return allModule
}
export function getUserRoute(userPermissions: Set<string>) {
	return allRoutes.filter((route) => !route.code || userPermissions.has(route.code))
}
// export function getUserMenu(userPermissions: Set<string>) {

// }
// }
// export function getUserRouterData(userPermissions:Set<string>) {
// 	let routes = [];
// 	moduleData.forEach(({ router }) => {
// 		for (let r of router) {
// 			if (r.code)
// 				permissionRouter[r.code] = r;
// 		}
// 		routes = [...routes, ...router]
// 	});

// 	const routerConfig = {};
// 	routes.forEach(item => {
// 		routerConfig[item.path] = {
// 			component: dynamicWrapper(app, item.models || [], () => item.component),
// 		};
// 	});

// 	const menuData = getFlatMenuData(getMenuData());
// 	const routerData = {};
// 	Object.keys(routerConfig).forEach(path => {

// 		const pathRegexp = pathToRegexp(path);
// 		const menuKey = Object.keys(menuData).find(key => pathRegexp.test(`${key}`));
// 		let menuItem = {};
// 		// If menuKey is not empty
// 		if (menuKey) {
// 			menuItem = menuData[menuKey];
// 		}
// 		let router = routerConfig[path];

// 		router = {
// 			...router,
// 			name: router.name || menuItem.name,
// 			authority: router.authority || menuItem.authority,
// 			hideInBreadcrumb: router.hideInBreadcrumb || menuItem.hideInBreadcrumb,
// 		};
// 		routerData[path] = router;
// 	});
// 	// console.log('routerData', routerData)
// 	return routerData;

// }



// export const getFlattenPermission = () => {
// 	let permissions = [];
// 	moduleData.forEach(({ permission = {} }) => {
// 		parsePermission(permission, permissions, "")
// 	});
// 	return permissions;
// }
// function parsePermission(permission, permissions, parentText) {
// 	let { actions = [], children = [], name } = permission;
// 	// console.log(actions, children, name)
// 	for (let child of children) {
// 		parsePermission(child, permissions, parentText ? `${parentText}-${name}` : name)
// 	}
// 	for (let action of actions) {
// 		permissions.push({ name: parentText ? `${parentText}-${name}-${action.name}` : `${name}-${action.name}`, code: action.code });
// 	}

// }
// export const getMenuData = () => {
// 	let menuData = [];
// 	moduleData.forEach(({ permission }) => {
// 		if (!permission || !permission.code) return;
// 		let { actions, ...menu } = permission;

// 		if (!userPermissions.has(menu.code))
// 			return;
// 		addMenuPath(menu)
// 		menuData.push(menu)
// 	});
// 	// console.log('menuData', menuData)
// 	return menuData;
// }
// const addMenuPath = (menu) => {
// 	if (permissionRouter[menu.code]) {
// 		let path = permissionRouter[menu.code].path
// 		if (path)
// 			menu.path = permissionRouter[menu.code].path;
// 	}
// 	// menu.path = menu.path || menu.code;

// 	if (!menu.children) {
// 		if (!menu.path) {
// 			let path = permissionRouter[`${menu.code}00`] && permissionRouter[`${menu.code}00`].path;
// 			menu.path = path;
// 		}
// 		return;
// 	}
// 	menu.children = menu.children.filter(child => userPermissions.has(child.code))
// 	for (let sonMenu of menu.children) {
// 		if (!menu.path && sonMenu.path)
// 			menu.path = sonMenu.path.slice(0, sonMenu.path.lastIndexOf('/'));
// 		addMenuPath(sonMenu);
// 	}
// }


// const modelNotExisted = (app, model) =>
// 	// eslint-disable-next-line
// 	!app._models.some(({ namespace }) => {
// 		return namespace === model.namespace.substring(model.namespace.lastIndexOf('/') + 1);
// 	});

// // wrapper of dynamic
// const dynamicWrapper = (app, models, component) => {

// 	// () => require('module')
// 	// transformed by babel-plugin-dynamic-import-node-sync
// 	if (component.toString().indexOf('.then(') < 0) {
// 		models.forEach(model => {
// 			if (modelNotExisted(app, model)) {
// 				// eslint-disable-next-line
// 				// app.model(require(`../models/${model}`).default);

// 				app.model(model);
// 			}
// 		});
// 		return props => {
// 			if (!routerDataCache) {
// 				routerDataCache = getRouterData(app);
// 			}
// 			return createElement(component().default, {
// 				...props,
// 				routerData: routerDataCache,
// 			});
// 		};
// 	}
// 	// () => import('module')
// 	// console.log(models, "component:", component())
// 	return dynamic({
// 		app,
// 		models: () => models.filter(model => modelNotExisted(app, model)),
// 		// add routerData prop
// 		component: () => {
// 			if (!routerDataCache) {
// 				routerDataCache = getRouterData(app);
// 			}
// 			return component().then(raw => {
// 				const Component = raw.default || raw;
// 				return props =>
// 					createElement(Component, {
// 						...props,
// 						routerData: routerDataCache,
// 					});
// 			});
// 		},
// 	});
// };

// function getFlatMenuData(menus) {
// 	let keys = {};
// 	menus.forEach(item => {
// 		if (item.children) {
// 			keys[item.path] = { ...item };
// 			keys = { ...keys, ...getFlatMenuData(item.children) };
// 		} else {
// 			keys[item.path] = { ...item };
// 		}
// 	});
// 	return keys;
// }

